package com.ants.boot.utils;

import org.apache.commons.lang3.StringUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 蚂蚁会花呗
 * @date 2022/4/22 16:10
 * java8 提供的日期api
 */
public class DateJava8Utils {

    /**
     * 默认的日期时间格式
     */
    private static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * 默认的日期格式
     */
    private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";

    /**
     * 获取当前时间
     * @return LocalDateTime
     */
    public static LocalDateTime getNow(){
       return LocalDateTime.now();
    }

    /**
     * 获取当前字符串时间
     * @param format 返回的格式
     * @return 字符串当前时间
     */
    public static String getNow(String format){
        if (StringUtils.isBlank(format)){
            format = DEFAULT_DATE_TIME_FORMAT;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return formatter.format(getNow());
    }

    /**
     * 获取当前日期的开始时间
     * 即 yyyy-MM-dd 00:00:00
     * @return
     */
    public static LocalDateTime getNowBegin(){
        return LocalDateTime.of(LocalDate.now(),LocalTime.MIN);
    }

    /**
     * 获取当前日期的结束时间
     * 即 yyyy-MM-dd 23:59:59
     * @return
     */
    public static LocalDateTime getNowEnd(){
        return LocalDateTime.of(LocalDate.now(),LocalTime.MAX);
    }


    /**
     * 获取当前年月
     * 即 yyyy-MM
     * @return 字符串yyyy-MM
     */
    public static String getNowYearMonth(){
        LocalDate date = LocalDate.now();
        String year = String.valueOf(date.getYear());
        String month = String.valueOf(date.getMonthValue());
        return  year + '-' + month;
    }

    /**
     * 字符串日期转日期时间，时间为当前时间
     * @param date yyyy-MM-dd
     * @return LocalDateTime
     */
    public static LocalDateTime getDateTime(String date){
        LocalTime time = LocalTime.now();
        return LocalDateTime.of(formatDate(date),time);
    }


    /**
     * 获取给定字符串时间yyyy-MM-dd的开始时间
     * @param date yyyy-MM-dd
     * @return yyyy-MM-dd 00:00:00
     */
    public static LocalDateTime getDateTimeBegin(String date){
        LocalDate localDate = LocalDate.parse(date);
        return LocalDateTime.of(localDate,LocalTime.MIN);
    }

    /**
     * 获取给定时间yyyy-MM-dd 几天前或者几天后的开始时间
     * @param date yyyy-MM-dd
     * @param days 前/后几天
     * @return yyyy-MM-dd 00:00:00
     */
    public static LocalDateTime getDateTimeBegin(String date,Integer days) {
        LocalDate localDate = beforeOrAfterLocalDate(date,days);
        return LocalDateTime.of(localDate,LocalTime.MIN);
    }


    /**
     * 获取给定字符串时间yyyy-MM-dd的结束时间
     * @param date yyyy-MM-dd
     * @return yyyy-MM-dd 23:59:59
     */
    public static LocalDateTime getDateTimeEnd(String date){
        LocalDate localDate = LocalDate.parse(date);
        return LocalDateTime.of(localDate,LocalTime.MAX);
    }

    /**
     * 获取给定字符串时间yyyy-MM-dd 几天前或者几天后的结束时间
     * @param date yyyy-MM-dd
     * @param days 前/后几天
     * @return yyyy-MM-dd 23:59:59
     */
    public static LocalDateTime getDateTimeEnd(String date,Integer days){
        LocalDate localDate = beforeOrAfterLocalDate(date,days);
        return LocalDateTime.of(localDate,LocalTime.MAX);
    }

    /**
     * LocalDate 日期转字符串日期
     * @param date LocalDate
     * @return yyyy-MM-dd
     */
    public static String formatDate(LocalDate date){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT);
        return formatter.format(date);
    }


    /**
     * 字符串日期转换为 LocalDate
     * yyyy-MM-dd
     * @param date
     * @return LocalDate
     */
    public static LocalDate formatDate(String date){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT);
        return LocalDate.parse(date,formatter);
    }


    /**
     * 字符串日期时间转为 LocalDateTime
     * @param dateTime yyyy-MM-dd HH:mm:ss
     * @return LocalDateTime
     */
    public static LocalDateTime formatDateTime(String dateTime){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT);
        return LocalDateTime.parse(dateTime,formatter);
    }

    /**
     * 根据传入的LocalDateTime日期时间
     * 返回默认的 yyyy-MM-dd HH:mm:ss 字符串日期时间
     * @param dateTime LocalDateTime
     * @return 默认格式字符串时间
     */
    public static String formatDateTime(LocalDateTime dateTime){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT);
        return formatter.format(dateTime);
    }

    /**
     * 根据传入的LocalDateTime时间
     * 返回格式化后的字符串日期，如果不传，返回默认格式
     * @param dateTime
     * @param format
     * @return 格式化后的字符串时间
     */
    public static String formatDateTime(LocalDateTime dateTime,String format){
        if (StringUtils.isBlank(format)){
            return formatDateTime(dateTime);
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return formatter.format(dateTime);
    }


    /**
     * 字符串日期往前或者往后推几天
     * @param date yyyy-MM-dd
     * @param days 天数
     * @return 返回往前或者往后推的yyyy-MM-dd字符串
     */
    public static String beforeOrAfter(String date,Integer days){
        LocalDate localDate = LocalDate.parse(date);
        return formatDate(localDate.plusDays(days));
    }

    /**
     * 字符串日期往前或者往后推几天
     * @param date yyyy-MM-dd
     * @param days 天数
     * @return LocalDate
     */
    public static LocalDate beforeOrAfterLocalDate(String date,Integer days){
        LocalDate localDate = LocalDate.parse(date);
        return localDate.plusDays(days);
    }


    /**
     * 往前推多少天
     * @param date yyyy-MM-dd
     * @param days 近几天
     * @return 近几天的（包含当天）yyyy-MM-dd 数组
     */
    public static List<String> listBeforeDate(String date,Integer days){
        days = Math.abs(days);
        List<String> list = new ArrayList<>();
        for (int i = days-1;i >= 0; i--){
            list.add(beforeOrAfter(date,-i));
        }
        return list;
    }

    /**
     * 往后推多少天
     * @param date yyyy-MM-dd
     * @param days 近几天
     * @return 往后推近几天（包含当天）的yyyy-MM-dd 数组
     */
    public static List<String> listAfterDate(String date,Integer days){
        days = Math.abs(days);
        List<String> list = new ArrayList<>();
        for (int i = 0;i< days; i++){
            list.add(beforeOrAfter(date,i));
        }
        return list;
    }

    public static void main(String[] args) {
        System.out.println(getNowYearMonth());
    }
}
